package thread;

/**
 * 中断线程:让一个线程停下来
 * 第一种方式:用一个标志位来控制线程结束,但不够严谨
 * 第二种方式:使用Thread中内置的一个标志位来判定
 * Thread.interrupted();                     静态方法
 * Thread.currentThread().isInterrupted();   currentThread()能获取当前线程的实例 (推荐)
 */

public class TestDemo5 {
    /*第二种方式*/
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    //触发异常后,立即退出
                    System.out.println("ByeBye!!!");
                    break;
                }
            }
        });
        t.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t.interrupt();
        /*此方法可能会有两种情况:
            1)如果t线程是处在就绪状态,就是设置线程的标志位为true
            2)如果t线程处在阻塞状态,就会出发一个异常
          我们这里的代码每次都会sleep进入阻塞状态,所以会报异常
        */
    }

    /*第一种方式*/
    public static boolean isQuit = false;

    public static void main1(String[] args) {
        Thread t = new Thread(() -> {
            while (!isQuit) {
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        //过了5s后,更改这个标志位,让这个线程停下来
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isQuit = true;
        System.out.println("线程中断");
    }
}
